package com.example.science.util;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private RedisTemplate<String,Object> redisTemplate;
    /**
     * 读取数据
     */
    public String getString(String key) {
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 写入数据
     */
    public void setString(String key, String value) {
        stringRedisTemplate.opsForValue().set(key, value);
    }
    /**
     * 写入数据并设置有效时间
     */
    public void setString(String key, String value,long seconds) {
        stringRedisTemplate.opsForValue().set(key, value,seconds, TimeUnit.SECONDS);
    }
    /**
     * 删除数据
     */
    public void del(String key) {
        stringRedisTemplate.delete(key);
    }
    /**
     * 获取指定键的剩余生存时间（TTL），单位为秒
     */
    public long ttl(String key) {
        return stringRedisTemplate.getExpire(key, TimeUnit.SECONDS);
    }
    /**
     * 检查指定键是否存在
     */
    public boolean exists(String key) {
        return stringRedisTemplate.hasKey(key);
    }

    /**
     * 将指定键的值自增1
     */
    public void increment(String key){
        stringRedisTemplate.opsForValue().increment(key);
    }
    /**
     * 向指定键的集合中添加多个元素
     */
    public void sadd(String key,Set<String> set){
        String[] arr = new String[set.size()];
        stringRedisTemplate.opsForSet().add(key,set.toArray(arr));
    }
    /**
     * 获取指定键的集合中的所有成员
     */
    public Set<String> smembers(String key){
        return stringRedisTemplate.opsForSet().members(key);
    }
    /**
     * 获取指定值在有序集合中的分数
     */
    public Double score(String key,String value){
        return stringRedisTemplate.opsForZSet().score(key,value);
    }
    /**
     * 向指定有序集合添加一个元素及其分数
     */
    public void zadd(String key,String value,long score){
        stringRedisTemplate.opsForZSet().add(key,value,score);
    }
    /**
     * 从指定有序集合中移除一个元素
     */
    public void zrem(String key, String value) {
        stringRedisTemplate.opsForZSet().remove(key, value);
    }
    /**
     * 增加指定元素在有序集合中的分数
     */
    public void zincrby(String key,String value,long score){
        stringRedisTemplate.opsForZSet().incrementScore(key,value,score);
    }
    /**
     * 获取指定有序集合中指定范围内的元素，按分数从高到低排序
     */
    public Set<String> zrevrange(String key,long start,long end){
        return stringRedisTemplate.opsForZSet().reverseRange(key,start,end);
    }
    /**
     * 获取指定有序集合的元素数量
     */
    public long zcard(String key){
        return stringRedisTemplate.opsForZSet().size(key);
    }
    /**
     * 从指定集合中移除一个元素
     */
    public void srem(String key,String value){
        stringRedisTemplate.opsForZSet().remove(key, value);
    }
    /**
     * 保存一个对象到Redis中，不设置过期时间
     */
    public void saveObject(String key,Object Value){
        redisTemplate.opsForValue().set(key, Value);
    }
    /**
     * 保存一个对象到Redis中，并设置过期时间
     */
    public void saveObject(String key,Object Value,long expire){
        redisTemplate.opsForValue().set(key, Value, expire, TimeUnit.SECONDS);
    }
    /**
     * 从Redis中获取指定键的对象
     */
    public Object getObject(String key){
        return redisTemplate.opsForValue().get(key);
    }
    /**
     * 存一组hash
     */
    public void saveHash(String key, Map<Object,Object> map){
        stringRedisTemplate.opsForHash().putAll(key, map);
    }
    /**
     * hash数据自增
     */
    public void hincrby(String key,String hashKey, long number){
        stringRedisTemplate.opsForHash().increment(key,hashKey, number);
    }

    /**
     * 取出hash中的一个数据
     */
    public String hget(String key,String hashKey){
         return stringRedisTemplate.opsForHash().get(key,hashKey).toString();
    }
    /**
     * 取出hash中的所有数据
     */
    public Map<Object,Object> hgetAll(String key) {
        return stringRedisTemplate.opsForHash().entries(key);
    }
}
